package com.xac.common.util.io;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

import android.os.Environment;

import com.xac.common.util.StringUtil;

/**
 * 1.定义各种和文件有关的常量，如格式 <p>
 * 2.定义各种和文件有关的操作
 * 
 * @author frank
 * 
 */
public class FileUtil {

	/** 图片类型 */
	public static List<String> imageExtensions = Arrays.asList("bmp", "gif", "jpg", "jpeg", "png");

	/** 媒体类型 */
	public static List<String> mediaExtensions = Arrays.asList("mp3", "amr", "pcm");

	/** 视频类型 */
	public static List<String> videoExtensions = Arrays.asList("mp4", "3gp");

	/**
	 * 取设备sdcard路径
	 * 
	 * @return sdcard路径
	 */
	public static String getSDCardPath() {

		boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); // 判断SD卡是否存在
		if (sdCardExist) {
			return Environment.getExternalStorageDirectory().toString(); // 获取根目录
		}

		return null;
	}

	/**
	 * 把文件转换为字节数组
	 * 
	 * @param file
	 *            文件
	 * @return 文件转换后的字节数组
	 */
	public static byte[] fileToByte(File file) {
		byte[] data = null;
		InputStream in = null;
		ByteArrayOutputStream out = null;

		try {
			in = new FileInputStream(file);
			out = new ByteArrayOutputStream();

			byte[] buffer = new byte[1024];
			int len = -1;
			while ((len = in.read(buffer)) != -1) {
				out.write(buffer, 0, len);
			}
			out.flush();
			data = out.toByteArray();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (in != null)
					in.close();
				if (out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return data;
	}

	/**
	 * 把文件转换为字节数组
	 * 
	 * @param path 文件路径
	 * @return 文件转换后的字节数组
	 */
	public static byte[] fileToByte(String path) {

		if (StringUtil.isNullOrEmpty(path)) {
			return null;
		}

		File file = new File(path);
		if (!file.exists()) {
			return null;
		}

		return fileToByte(file);
	}

	/**
	 * 把字节数组转换成文件
	 * 
	 * @param data 字节数组
	 * @param path 文件路径
	 * @return 转换后的文件
	 */
	public static File byteToFile(byte[] data, String path) {
		File file = null;
		FileOutputStream fos = null;
		BufferedOutputStream out = null;

		try {
			file = new File(path);
			if (!file.exists()) {
				File parent = file.getParentFile();
				parent.mkdirs();
			}
			fos = new FileOutputStream(file);
			out = new BufferedOutputStream(fos);
			out.write(data);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (fos != null)
					fos.close();
				if (out != null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return file;
	}

	/**
	 * 获取文件类型
	 * 
	 * @param file 文件
	 * @return 文件类型
	 */
	public static String getFileType(File file) {
		int index = file.getName().lastIndexOf('.');
		if (index != -1) {
			return file.getName().substring(index + 1).toLowerCase();
		}

		return null;
	}

	/**
	 * 检查一个文件类型是否是图片类型
	 * 
	 * @param file 文件
	 * @return true 表示是图片类型 false 表示不是图片类型
	 */
	public static boolean isPictureType(File file) {
		String type = getFileType(file);
		if (imageExtensions.contains(type)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 检查一个文件类型是否是音频类型
	 * 
	 * @param file 文件
	 * @return true 表示是音频类型 false 表示不是图片类型
	 */
	public static boolean isMediaType(File file) {
		String type = getFileType(file);
		if (mediaExtensions.contains(type)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 检查一个文件类型是否是视频类型
	 * 
	 * @param file 文件
	 * @return true 表示是视频类型 false 表示不是视频类型
	 */
	public static boolean isVideoType(File file) {
		String type = getFileType(file);
		if (videoExtensions.contains(type)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 获取一个文件的MIME类型
	 * 
	 * @param file 文件
	 * @return 文件的MIME类型
	 * */
	public static String getMimeType(File file) {
		String mimeType = null;
		if (file == null || !file.exists()) {
			return "*/*";
		}
		int index = file.getName().lastIndexOf(".");
		if (index == -1) {
			return "*/*";
		}
		String extName = file.getName().substring(index).toLowerCase();
		if (".png".equals(extName) || ".gif".equals(extName) || ".jpg".equals(extName)) {
			mimeType = "image";
		} else if (".mp3".equals(extName) || ".wav".equals(extName) || ".ogg".equals(extName) || ".mid".equals(extName)) {
			mimeType = "audio";
		} else if (".apk".equals(extName)) {
			mimeType = "application/vnd.android.package-archive";
		} else if (".txt".equals(extName)) {
			mimeType = "text";
		} else {
			mimeType = "*";
		}
		if (!".apk".equals(extName)) {
			mimeType += "/*";
		}
		return mimeType;
	}
}
